﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace 共享单车管理系统
{
    public partial class shops : Form
    {
        public shops()
        {
            InitializeComponent();
        }
        public static decimal profit = 0;//利润

        SqlDataAdapter daCartItem; // 定义一个用于填充购物车信息的数据适配器
        SqlDataAdapter daProduct; // 定义一个用于填充产品信息的数据适配器
        SqlDataAdapter daShop11; // 定义一个用于填充 shop11 表信息的数据适配器
        DataSet ds = new DataSet(); // 定义一个数据集，用于存储数据
        Cartltemsv cartsver = new Cartltemsv(); // 实例化一个 Cartltemsv 类

        void init()
        {
            // 初始化方法，用于获取购物车信息和产品信息
            string str = "select userid,shopid,BikeID,dancheleixing,jiage,qty from shop where UserID=" + Convert.ToInt32(Login.UserID) + "";
            // 获取购物车信息的 SQL 查询语句
            daCartItem = new SqlDataAdapter(str, DB.cn); // 初始化购物车数据适配器
            daCartItem.Fill(ds, "Cartem_info"); // 填充购物车信息到数据集中的 Cartem_info 表
            string sdr = "select *from Bike"; // 获取产品信息的 SQL 查询语句
            daProduct = new SqlDataAdapter(sdr, DB.cn); // 初始化产品数据适配器
            daProduct.Fill(ds, "product_info"); // 填充产品信息到数据集中的 product_info 表

            string shop11Query = "SELECT * FROM shop11";
            daShop11 = new SqlDataAdapter(shop11Query, DB.cn);
            daShop11.Fill(ds, "shop11");


        }

        void showx2()
        {
            // 显示选择列
            DataGridViewCheckBoxColumn acCode = new DataGridViewCheckBoxColumn();
            acCode.Name = "acCode";
            acCode.HeaderText = "选择";
            dgvcars.Columns.Add(acCode); // 将选择列添加到 DataGridView 中
        }

        void dgvHead()
        {
            // 设置 DataGridView 的列名
            dgvcars.Columns[0].HeaderText = "用户编号";
            dgvcars.Columns[1].HeaderText = "购物车编号";
            dgvcars.Columns[2].HeaderText = "单车编号";
            dgvcars.Columns[3].HeaderText = "单车类型";
            dgvcars.Columns[4].HeaderText = "价格";
            dgvcars.Columns[5].HeaderText = "购买数量";
        }

        void Bind()
        {
            // 数据绑定方法，将购物车信息绑定到 DataGridView 中显示
            init(); // 调用初始化方法获取数据
            lbltotalprice.Text = cartsver.GetTotalPriceByUserID(Convert.ToInt32(Login.UserID)).Item1.ToString(); // 在标签上显示用户的总价
            profit = cartsver.GetTotalPriceByUserID(Convert.ToInt32(Login.UserID)).Item2; // 计算用户的利润
            DataView dgvcar = new DataView(ds.Tables["Cartem_info"]); // 创建一个 DataView 对象用于显示购物车信息
            dgvcars.DataSource = dgvcar; // 将 DataView 绑定到 DataGridView 中
            dgvHead(); // 调用设置列名的方法
            showx2(); // 调用显示选择列的方法
        }

        void Clear_CartItem()
        {
            // 清空购物车方法
            List<int> List_index = new List<int>(); // 创建一个整型列表用于存储要删除的行索引
            if (dgvcars.Rows.Count > 0)
            {
                // 如果购物车中有数据
                for (int i = 0; i < dgvcars.Rows.Count - 1; i++)
                {
                    List_index.Add(i); // 将行索引添加到列表中
                }
                int z = 0;
                foreach (int n in List_index)
                {
                    dgvcars.Rows.RemoveAt(n - z); // 逐行删除购物车中的数据
                    z++;
                }
                UpdateDB(); // 更新数据库
            }
        }

        private void shop_Load(object sender, EventArgs e)
        {
            DB.GetCn(); // 连接数据库
            cartsver.Add(Convert.ToInt32(Login.UserID), Convert.ToInt32(Form1.BikeID), 1); // 将商品添加到购物车
            Bind(); // 数据绑定
        }

        private void dgvcars_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            // 单元格点击事件，用于处理选择行
            if (dgvcars.Rows.Count > 0)
            {
                for (int i = 0; i < dgvcars.Rows.Count; i++)
                {
                    DataGridViewCheckBoxCell ck = dgvcars.Rows[1].Cells["acCode"] as DataGridViewCheckBoxCell;
                    if (i != e.RowIndex)
                    {
                        ck.Value = false;
                    }
                    else
                    {
                        ck.Value = true;
                    }

                }

            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // 删除按钮点击事件，用于删除选中行的数据
            int s = dgvcars.Rows.Count;
            for (int i = 0; i < dgvcars.Rows.Count; i++)
            {
                if (dgvcars.Rows[i].Cells["acCode"].EditedFormattedValue.ToString() == "True")
                {
                    dgvcars.Rows.RemoveAt(i); // 删除选中行
                    UpdateDB(); // 更新数据库
                }
                else
                {
                    s = s - i;
                }

            }
            if (s == 0)
            {
                MessageBox.Show("选择删除的项"); // 如果没有选中行，则提示用户选择
            }

        }

        void UpdateDB()
        {
            // 更新数据库方法
            try
            {
                SqlCommandBuilder dbCartItem = new SqlCommandBuilder(daCartItem);
                daCartItem.Update(ds, "Cartem_info"); // 更新购物车信息到数据库
                SqlCommandBuilder dbProduct = new SqlCommandBuilder(daProduct);
                daProduct.Update(ds, "product_info"); // 更新产品信息到数据库

                // 更新 shop11 表数据
                SqlCommandBuilder dbShop11 = new SqlCommandBuilder(daShop11);
                daShop11.Update(ds, "shop11");//System.NullReferenceException:“未将对象引用设置到对象的实例。”

            }
            catch (SqlException ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            // 计算按钮点击事件，用于计算总价和利润
            lbltotalprice.Text = cartsver.GetTotalPriceByUserID(Convert.ToInt32(Login.UserID)).Item1.ToString(); // 在标签上显示用户的总价
            profit = cartsver.GetTotalPriceByUserID(Convert.ToInt32(Login.UserID)).Item2; // 计算用户的利润
        }

        private void button2_Click(object sender, EventArgs e)
        {
            // 清空按钮点击事件，用于清空购物车
            Clear_CartItem(); // 调用清空购物车方法
        }

        private void button4_Click(object sender, EventArgs e)
        {
            // 结算按钮点击事件，用于结算购物车中的商品
            if (dgvcars.Rows.Count == 1)
            {
                MessageBox.Show("请加入购物车"); // 如果购物车为空，则提示用户加入商品

            }
            else
            {
                List<int> List_index = new List<int>();
                for (int i = 0; i < dgvcars.Rows.Count - 1; i++)
                {
                    List_index.Add(i);
                }
                foreach (int n in List_index)
                {
                    string str = dgvcars.Rows[n].Cells["BikeID"].Value.ToString();
                    DataRow[] CustRow = ds.Tables["product_info"].Select("BikeID='" + str + "'");
                    CustRow[0]["kucun"] = (Convert.ToInt32(CustRow[0]["kucun"]) - Convert.ToInt32(dgvcars.Rows[n].Cells["Qty"].Value)).ToString();
                }
                UpdateDB(); // 更新数据库

                // 将购物车数据写入 shop11 表
                DataRow[] cartRows = ds.Tables["Cartem_info"].Select(); // 获取购物车中的所有行
                foreach (DataRow row in cartRows)
                {
                    DataRow newRow = ds.Tables["shop11"].NewRow();
                    newRow["userid"] = row["userid"];
                    newRow["shopid"] = row["shopid"];
                    newRow["BikeID"] = row["BikeID"];
                    newRow["dancheleixing"] = row["dancheleixing"];
                    newRow["jiage"] = row["jiage"];
                    newRow["qty"] = row["qty"];
                    newRow["T"] = DateTime.Now;
                    ds.Tables["shop11"].Rows.Add(newRow);
                }

                // 清空购物车
                Clear_CartItem(); // 清空购物车
                this.Close(); // 关闭当前窗体
                sub s1 = new sub();
                s1.ShowDialog(); // 打开子窗体 sub   
            }
        }

        private void dgvcars_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }

        private void lbltotalprice_Click(object sender, EventArgs e)
        {

        }
    }
}